/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package pe.gob.pnp.digitalizar.despachadores;

import java.sql.*;
import java.text.*;
import java.util.*;
import oracle.jdbc.OracleTypes;
import org.apache.log4j.Logger;
import pe.gob.pnp.digitalizar.beans.*;
import pe.gob.pnp.factories.*;

/**
 *
 * @author Eduardo
 */
public class PersonalDespachador {

    private static final Logger logger = Logger.getLogger(PersonalDespachador.class);

    public static List<PersonalBean> obtenerPersonas(PersonalBean parametros) throws SQLException {
        List<PersonalBean> personas = new ArrayList<PersonalBean>();
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "{call SP_FILTRAR_PERSONAL(?,?,?,?)}";
            CallableStatement cs = conn.prepareCall(sql);
            cs.setString(1, parametros.getApellidoPaterno());
            cs.setString(2, parametros.getApellidoMaterno());
            cs.setString(3, parametros.getNombres());
            cs.registerOutParameter(4, OracleTypes.CURSOR);
            cs.execute();
            ResultSet rs = (ResultSet) cs.getObject(4);
            while (rs.next()) {
                PersonalBean persona = new PersonalBean();
                persona.setApellidoMaterno(rs.getString("CPERS_APEMATERNO").toUpperCase());
                persona.setApellidoPaterno(rs.getString("CPERS_APEPATERNO").toUpperCase());
                persona.setId(rs.getInt("NPERS_IDENTIFICADOR"));
                persona.setNombres(rs.getString("CPERS_NOMBRE").toUpperCase());
                persona.setBpersTitular(rs.getBoolean("BPERS_TITULAR"));
                persona.setNpersTitular(rs.getInt("NPERS_TITULAR"));
                persona.setCpers_codofin(rs.getString("CPERS_CODOFIN"));
                persona.setCpers_nrocip(rs.getString("CPERS_NROCIP"));
                persona.setCpers_unidad(rs.getString("CPERS_UNIDAD"));
                persona.setCpers_nrodni(rs.getString("CPERS_NRODNI"));
                persona.setCgrad_descripcion(rs.getString("CGRAD_DESCRIPCION"));
                personas.add(persona);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return personas;
    }

    public static void obtenerPersonalPolicial(PersonalBean persona) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "SELECT NPERS_IDENTIFICADOR, NPEPO_IDENTIFICADOR, DPEPO_FECHABAJA,G.CGRAD_DESCRIPCION";
            sql += " FROM PERMA_PERSONALPOLICIAL P";
            sql += " LEFT JOIN SISMA_GRADO G";
            sql += " ON G.NGRAD_IDENTIFICADOR=P.NGRAD_IDENTIFICADOR";
            sql += " WHERE NPERS_IDENTIFICADOR=?";
         //   sql += " AND BPEPO_ELIMINADO=0";
            logger.debug( sql );
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, persona.getId());
            ResultSet rs = ps.executeQuery();
            if (rs.next()) {
                java.util.Date fechaBaja = rs.getDate("DPEPO_FECHABAJA");
                SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                persona.setFechaBaja(df.format(fechaBaja));
                persona.setGrado(sql);
                persona.setGrado(rs.getString("CGRAD_DESCRIPCION"));
                persona.setIdPolicial(rs.getInt("NPEPO_IDENTIFICADOR"));
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }

    }

    public static PersonalBean obtenerPersonalPolicial(int npepo) throws SQLException {
        Connection conn = null;
        PersonalBean persona = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "SELECT P.NPERS_IDENTIFICADOR, P.NPEPO_IDENTIFICADOR, P.DPEPO_FECHABAJA,";
            sql += " R.CPERS_APEPATERNO, R.CPERS_APEMATERNO, R.CPERS_NOMBRE, R.CPERS_SEXO, ";
            sql += " R.CGRAD_DESCRIPCION,R.NGRAD_CODIGOSIGE,  ";
            sql += " R.CPERS_APEPATERNO || ' ' || R.CPERS_APEMATERNO || ', ' || R.CPERS_NOMBRE as nombrecompleto, ";
            sql += " G.ngrad_tipooficial , G.NGRAD_TIPOGRADO, P.NDEPE_IDENTIFICADOR"; //NdepeIdentificador
            sql += " FROM PERMA_PERSONALPOLICIAL P";
            sql += " INNER JOIN PERMA_PERSONA R on P.NPERS_IDENTIFICADOR = R.NPERS_IDENTIFICADOR ";
            sql += " LEFT outer JOIN SISMA_GRADO G ON G.NGRAD_IDENTIFICADOR = R.NGRAD_CODIGOSIGE";
            sql += " WHERE P.NPEPO_IDENTIFICADOR=?";
            sql += " AND P.BPEPO_ELIMINADO=0";
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1, npepo);
            ResultSet rs = ps.executeQuery();
            logger.debug( sql );
            logger.debug("NPEPo = " + npepo) ;
            if (rs.next()) {
                persona = new PersonalBean();
                java.util.Date fechaBaja = rs.getDate("DPEPO_FECHABAJA");
                SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
                persona.setFechaBaja(df.format(fechaBaja));
                persona.setGrado(rs.getString("CGRAD_DESCRIPCION"));
                persona.setIdPolicial(rs.getInt("NPEPO_IDENTIFICADOR"));
                persona.setNombreCompleto( rs.getString("nombrecompleto"));
                persona.setNombres(rs.getString("CPERS_NOMBRE"));
                persona.setApellidoPaterno(rs.getString("CPERS_APEPATERNO"));
                persona.setApellidoMaterno(rs.getString("CPERS_APEMATERNO"));
                persona.setNgrad_tipooficial(rs.getString("ngrad_tipooficial"));
                persona.setCpers_sexo(rs.getString("CPERS_SEXO"));
                persona.setNdepeIdentificador(rs.getInt("NDEPE_IDENTIFICADOR"));
                persona.setNgrad_tipogrado(rs.getString("NGRAD_TIPOGRADO"));
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
        return persona;
    }


    public static void agregarPersonalPolicial(PersonalBean persona) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql ="SELECT COUNT(*) AS EXISTE FROM PERMA_PERSONALPOLICIAL";
            sql += " WHERE NPERS_IDENTIFICADOR=?";
            logger.debug( sql );
            PreparedStatement ps = conn.prepareStatement(sql);
            ps.setInt(1,persona.getId());
            ResultSet rs = ps.executeQuery();
            if (rs.next()){
                if (rs.getInt("EXISTE")<1){
                    sql = "INSERT INTO PERMA_PERSONALPOLICIAL(NPERS_IDENTIFICADOR,NPEPO_IDENTIFICADOR,NPEPO_TIEMPOSERVICIO,";
                    sql += " BPEPO_PERTENECECUADROMERITO,DPEPO_FECHACREACION,BPEPO_ELIMINADO)";
                    sql += " VALUES(?,SEQ_NPEPO_IDENTIFICADOR.NEXTVAL,0,0,SYSDATE,0)";
                    ps = conn.prepareStatement(sql);
                    ps.setInt(1, persona.getId());
                    ps.executeUpdate();
                }
            }
            sql = "SELECT NPEPO_IDENTIFICADOR AS ID";
            sql += " FROM PERMA_PERSONALPOLICIAL";
            sql += " WHERE NPERS_IDENTIFICADOR=?";
            logger.debug( sql );
            ps = conn.prepareStatement(sql);
            ps.setInt(1,persona.getId());
            rs = ps.executeQuery();
            if (rs.next()) {
                persona.setIdPolicial(rs.getInt("ID"));
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void actualizarPersonalPolicial(PersonalBean persona) throws SQLException {
        Connection conn = null;
        try {
            conn = ConnectionPool.obtenerConexion();
            String sql = "UPDATE PERMA_PERSONALPOLICIAL";
            sql += " SET DPEPO_FECHABAJA=?";
            sql += " WHERE NPEPO_IDENTIFICADOR=?";
            PreparedStatement ps = conn.prepareStatement(sql);
            SimpleDateFormat df = new SimpleDateFormat("dd/MM/yyyy");
            logger.debug( sql );
            java.util.Date fechaBaja = null;
            try {
                fechaBaja = df.parse(persona.getFechaBaja());
                ps.setTimestamp(1, new Timestamp(fechaBaja.getTime()));
                ps.setInt(2, persona.getIdPolicial());
                ps.executeUpdate();
            } catch(ParseException ex){
                throw new SQLException(ex);
            }
        } finally {
            ConnectionPool.liberarConexion(conn);
        }
    }

    public static void cambiarCausante(int idExpediente, int idPolicialNuevo) throws SQLException {
         Connection conn = null;
         try {
             conn = ConnectionPool.obtenerConexion();
             String sql = "UPDATE SISMA_EXPEDIENTE";
             sql += " SET NPEPO_IDENTIFICADOR=?";
             sql += " WHERE NEXPE_IDENTIFICADOR=?";
             logger.debug( sql );
             PreparedStatement ps = conn.prepareStatement(sql);
             ps.setInt(1, idPolicialNuevo);
             ps.setInt(2, idExpediente);
             ps.executeUpdate();
         } finally {
             ConnectionPool.liberarConexion(conn);
         }
    }
}
